#include <ESP32Servo.h>
#include <ESP32Time.h>

Servo myservo;  // 创建舵机对象以控制舵机
int pos = 0;    // 用于存储舵机位置的变量
int servoPin = 5;  // 舵机信号连接的引脚

// 定义关灯和开灯的角度偏移量
const int OFFSET_ANGLE = 85;

// 定义关灯和开灯的时间
const int LIGHT_OFF_HOUR = 23;
const int LIGHT_OFF_MINUTE = 29;
const int LIGHT_ON_HOUR = 9;
const int LIGHT_ON_MINUTE = 0;

ESP32Time rtc(3600);  // offset in seconds GMT+1

void setup() {
  Serial.begin(115200);
  // 允许分配所有定时器
  ESP32PWM::allocateTimer(0);
  ESP32PWM::allocateTimer(1);
  ESP32PWM::allocateTimer(2);
  ESP32PWM::allocateTimer(3);
  myservo.setPeriodHertz(50);    // 标准50Hz舵机
  myservo.attach(servoPin, 500, 2500); // 将舵机连接到指定引脚
  myservo.write(90);    // 让舵机初始位置为90°

  rtc.setTime(0, 0, 0, 1, 1, 2024);  // 设置初始时间，这里设置为2024年1月1日0点0分0秒
}

void loop() {
  struct tm timeinfo = rtc.getTimeStruct();
  int currentHour = rtc.getHour(true);  // 获取24小时制的当前小时
  int currentMinute = rtc.getMinute();  // 获取当前分钟
  int currentSecond = rtc.getSecond();

  // 检查是否到了关灯时间
  if (currentHour == 1 && currentMinute == 0 && currentSecond == 5) {
    // 舵机逆时针转动一个小角度
    myservo.write(90 - OFFSET_ANGLE);
    delay(500);
    // 舵机恢复到初始位置
    myservo.write(90);
    // 等待一分钟，避免重复触发
    //delay(60000);
  }

  // 检查是否到了开灯时间
  if (currentHour == 1 && currentMinute == 0 && currentSecond == 10) {
    // 舵机顺时针转动一个小角度
    myservo.write(90 + OFFSET_ANGLE);
    delay(500);
    // 舵机恢复到初始位置
    myservo.write(90);
    // 等待一分钟，避免重复触发
    //delay(60000);
  }

  delay(1000); // 每秒检查一次时间
  Serial.println(rtc.getTime("%A, %B %d %Y %H:%M:%S"));   // (String) returns time with specified format 
}